package mx.ipn.persistencia.mysql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import mx.ipn.persistencia.FabricaDeDAOs;
import mx.ipn.persistencia.dao.ColoniaCalleDAO;
import mx.ipn.persistencia.dao.ColoniaDAO;
import mx.ipn.persistencia.dao.CalleDAO;
import mx.ipn.to.ColoniaCalleTO;
import mx.ipn.to.ColoniaTO;
import mx.ipn.to.CalleTO;

public class ColoniaCalleDAOMySQL implements ColoniaCalleDAO {
	static{FabricaDeDAOsMySQL.iniciaLog(ColoniaCalleDAOMySQL.class);}

	private static final String INSERT = "INSERT INTO colonia_calle (id_colonia,id_calle,plano,columna,renglon) VALUES(?,?,?,?,?)";
	private static final String DELETE = "DELETE FROM colonia_calle WHERE id_colonia_calle=?";
	private static final String UPDATE = "UPDATE colonia_calle SET id_colonia=?,id_calle=?,plano=?,columna=?,renglon=? WHERE id_colonia_calle=?";

	private static final String FINDBYID = "SELECT * FROM colonia_calle WHERE id_colonia_calle=?";
	private static final String SELECT = "SELECT * FROM colonia_calle";
	private static final String SELECTBYCOLONIA = "SELECT * FROM colonia_calle WHERE id_colonia=?";
	private static final String SELECTBYCALLE = "SELECT * FROM colonia_calle WHERE id_calle=?";

	@Override
	public short deleteColoniaCalle(int idColoniaCalle) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(DELETE);

			ps.setInt(1, idColoniaCalle);

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			}

			else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

	@Override
	public ColoniaCalleTO findColoniaCalleById(int idColoniaCalle) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYID);

			ps.setInt(1, idColoniaCalle);

			ResultSet rs = ps.executeQuery();
			FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
			ColoniaDAO coloniaDAO = fabricaMySQL.getColoniaDAO();
			CalleDAO calleDAO = fabricaMySQL.getCalleDAO();
			if (rs.next()) {
				idColoniaCalle = rs.getInt("id_colonia_calle");

				ArrayList<ColoniaTO> listColoniaTO = new ArrayList<ColoniaTO>();
				ArrayList<CalleTO> listCalleTO = new ArrayList<CalleTO>();
				String plano = rs.getString("plano");
				String columna = rs.getString("columna");
				String renglon = rs.getString("renglon");

				ColoniaTO coloniaTO = coloniaDAO.findColoniaById(rs
						.getInt("id_colonia"));
				CalleTO calleTO = calleDAO.findCalleById(rs.getInt("id_calle"));

				listColoniaTO.add(coloniaTO);
				listCalleTO.add(calleTO);

				ColoniaTO[] arrColonia = (ColoniaTO[])listColoniaTO.toArray(new ColoniaTO[listColoniaTO.size()]);
				CalleTO[] arrCalle = (CalleTO[])listCalleTO.toArray(new CalleTO[listCalleTO.size()]);
				
				ColoniaCalleTO coloniaCalleTO = new ColoniaCalleTO(
						idColoniaCalle, arrColonia, arrCalle, plano, columna,
						renglon);

				ps.close();
				conexion.close();
				return coloniaCalleTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public boolean insertColoniaCalle(ColoniaCalleTO coloniaCalleTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);

			ps.setInt(1, coloniaCalleTO.getIdColonia());
			ps.setInt(2, coloniaCalleTO.getIdCalle());
			ps.setString(3, coloniaCalleTO.getPlano());
			ps.setString(4, coloniaCalleTO.getColumna());
			ps.setString(5, coloniaCalleTO.getRenglon());

			ps.executeUpdate();

			ps.close();
			conexion.close();

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	@Override
	public ArrayList<ColoniaCalleTO> selectColoniaCalle() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();
			FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
			ColoniaDAO coloniaDAO = fabricaMySQL.getColoniaDAO();
			CalleDAO calleDAO = fabricaMySQL.getCalleDAO();
			ArrayList<ColoniaCalleTO> coleccion = null;
			ArrayList<ColoniaTO> listColoniaTO = null;
			ArrayList<CalleTO> listCalleTO = null;

			while (rs.next()) {
				if (coleccion == null) {
					coleccion = new ArrayList<ColoniaCalleTO>();
				}

				listColoniaTO = new ArrayList<ColoniaTO>();
				listCalleTO = new ArrayList<CalleTO>();

				int idColoniaCalle = rs.getInt("id_colonia_calle");

				ColoniaTO coloniaTO = coloniaDAO.findColoniaById(rs
						.getInt("id_colonia"));
				CalleTO calleTO = calleDAO.findCalleById(rs.getInt("id_calle"));

				listColoniaTO.add(coloniaTO);
				listCalleTO.add(calleTO);
				String plano = rs.getString("plano");
				String columna = rs.getString("columna");
				String renglon = rs.getString("renglon");

				ColoniaTO[] arrColonia = (ColoniaTO[])listColoniaTO.toArray(new ColoniaTO[listColoniaTO.size()]);
				CalleTO[] arrCalle = (CalleTO[])listCalleTO.toArray(new CalleTO[listCalleTO.size()]);
				
				ColoniaCalleTO coloniaCalleTO = new ColoniaCalleTO(
						idColoniaCalle, arrColonia, arrCalle, plano, columna,
						renglon);

				coleccion.add(coloniaCalleTO);
			}

			ps.close();
			conexion.close();

			return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ColoniaCalleTO selectColoniaCalleByCalle(int idCalle) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			
			FabricaDeDAOs fabricaMySQL = null;
			
			ColoniaDAO coloniaDAO = null;
			CalleDAO calleDAO = null;

			ArrayList<Integer> listIdColoniaCalle = null;
			ArrayList<String> listPlano = null;
			ArrayList<String> listColumna = null;
			ArrayList<String> listRenglon = null;
			ArrayList<ColoniaTO> listColoniaTO = null;
			ArrayList<CalleTO> listCalleTO = null;

			ColoniaCalleTO coloniaCalleTO = null;

			PreparedStatement ps = conexion.prepareStatement(SELECTBYCALLE);
			ps.setInt(1, idCalle);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdColoniaCalle == null) {

					listIdColoniaCalle = new ArrayList<Integer>();
					listPlano = new ArrayList<String>();
					listColumna = new ArrayList<String>();
					listRenglon = new ArrayList<String>();
					listColoniaTO = new ArrayList<ColoniaTO>();
					listCalleTO = new ArrayList<CalleTO>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					coloniaDAO = fabricaMySQL.getColoniaDAO();
					calleDAO = fabricaMySQL.getCalleDAO();
				}

				listIdColoniaCalle.add(rs.getInt("id_colonia_calle"));
				listPlano.add(rs.getString("plano"));
				listColumna.add(rs.getString("columna"));
				listRenglon.add(rs.getString("renglon"));
				listColoniaTO.add(coloniaDAO.findColoniaById(rs.getInt("id_colonia")));

			}
			if (listIdColoniaCalle != null) {
				listCalleTO.add(calleDAO.findCalleById(idCalle));
				
				ColoniaTO[] arrColonia = (ColoniaTO[])listColoniaTO.toArray(new ColoniaTO[listColoniaTO.size()]);
				CalleTO[] arrCalle = (CalleTO[])listCalleTO.toArray(new CalleTO[listCalleTO.size()]);
				
				Integer[] arrIdColoniaCalle = (Integer[])listIdColoniaCalle.toArray(new Integer[listIdColoniaCalle.size()]);
				String[] arrPlano = (String[])listPlano.toArray(new String[listPlano.size()]);
				String[] arrColumna = (String[])listColumna.toArray(new String[listColumna.size()]);
				String[] arrRenglon = (String[])listRenglon.toArray(new String[listRenglon.size()]);
				
				coloniaCalleTO = new ColoniaCalleTO(arrIdColoniaCalle, arrColonia,
						arrCalle,arrPlano,arrColumna,arrRenglon);
			}
			ps.close();
			conexion.close();
			return coloniaCalleTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ColoniaCalleTO selectColoniaCalleByColonia(int idColonia) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
		
			FabricaDeDAOs fabricaMySQL = null;
		
			ColoniaDAO coloniaDAO = null;
			CalleDAO calleDAO = null;

			ArrayList<Integer> listIdColoniaCalle = null;
			ArrayList<String> listPlano = null;
			ArrayList<String> listColumna = null;
			ArrayList<String> listRenglon = null;
			ArrayList<ColoniaTO> listColoniaTO = null;
			ArrayList<CalleTO> listCalleTO = null;

			ColoniaCalleTO coloniaCalleTO = null;

			PreparedStatement ps = conexion.prepareStatement(SELECTBYCOLONIA);
			ps.setInt(1, idColonia);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdColoniaCalle == null) {

					listIdColoniaCalle = new ArrayList<Integer>();
					listPlano = new ArrayList<String>();
					listColumna = new ArrayList<String>();
					listRenglon = new ArrayList<String>();
					listColoniaTO = new ArrayList<ColoniaTO>();
					listCalleTO = new ArrayList<CalleTO>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					coloniaDAO = fabricaMySQL.getColoniaDAO();
					calleDAO = fabricaMySQL.getCalleDAO();
				}

				listIdColoniaCalle.add(rs.getInt("id_colonia_calle"));
				listPlano.add(rs.getString("plano"));
				listColumna.add(rs.getString("columna"));
				listRenglon.add(rs.getString("renglon"));
				listCalleTO.add(calleDAO.findCalleById(rs.getInt("id_calle")));

			}
			if (listIdColoniaCalle != null) {
				listColoniaTO.add(coloniaDAO.findColoniaById(idColonia));
				ColoniaTO[] arrColonia = (ColoniaTO[])listColoniaTO.toArray(new ColoniaTO[listColoniaTO.size()]);
				CalleTO[] arrCalle = (CalleTO[])listCalleTO.toArray(new CalleTO[listCalleTO.size()]);
				
				Integer[] arrIdColoniaCalle = (Integer[])listIdColoniaCalle.toArray(new Integer[listIdColoniaCalle.size()]);
				String[] arrPlano = (String[])listPlano.toArray(new String[listPlano.size()]);
				String[] arrColumna = (String[])listColumna.toArray(new String[listColumna.size()]);
				String[] arrRenglon = (String[])listRenglon.toArray(new String[listRenglon.size()]);
				
				coloniaCalleTO = new ColoniaCalleTO(arrIdColoniaCalle, arrColonia,
						arrCalle,arrPlano,arrColumna,arrRenglon);
			}
			ps.close();
			conexion.close();
			return coloniaCalleTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public short updateColoniaCalle(ColoniaCalleTO coloniaCalleTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(UPDATE);

			ps.setInt(1, coloniaCalleTO.getIdColonia());
			ps.setInt(2, coloniaCalleTO.getIdCalle());
			ps.setString(3, coloniaCalleTO.getPlano());
			ps.setString(4, coloniaCalleTO.getColumna());
			ps.setString(5, coloniaCalleTO.getRenglon());
			ps.setInt(6, coloniaCalleTO.getIdColoniaCalle());

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			}

			else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

}
